package com.swf.seed.jolt;

import bea.jolt.pool.SessionPoolManager;
import bea.jolt.pool.SessionPool;
import bea.jolt.pool.UserInfo;

/**
 * <p>Title: Jolt池管理器</p>
 * <p>Description: 对Jolt连接池做了一个简单的封装。</p>
 * <p>Copyright: Copyright (c) 2009</p>
 * <p>Company: Beijing Watchdata CO,.Ltd</p>
 * @author da.wang
 * @version 1.0
 */
public class JoltPoolManager {
    private static SessionPoolManager poolManager = null;

    private JoltPoolManager() {
    }

    /**
     * 得到会话池
     * @param sessionName String 会话池名称
     * @throws WDJoltException 如果第一次调用,加载配置文件出错
     * @return SessionPool 指定名称的会话池,如果没有找到指定的会话池,返回null
     */
    public static SessionPool getPool( String sessionName )
        throws WDJoltException {
        JoltConfig cfg = JoltConfig.getInstance();
        if ( poolManager == null ) {
            createPoolManager( cfg );
        }
        return poolManager.getSessionPool( sessionName );
    }

    /**
     * 得到默认会话池
     * @throws WDJoltException 如果第一次使用,加载配置文件出错异常
     * @return SessionPool 默认会话池.没有得到会话池时,返回null
     */
    public static SessionPool getPool() throws WDJoltException{
        return getPool( null );
    }

    /**
     * 建立池管理器
     * @param cfg JoltConfig Jolt配置
     */
    private static synchronized void createPoolManager( JoltConfig cfg ) {
        if ( poolManager == null ) {
            poolManager = new SessionPoolManager();
            UserInfo user;
            PoolConfigItem item;
            // 建连接池
            for( int i=0; i<cfg.getPoolConfig().getConfigCount(); i++ ) {
                user = new UserInfo();
                item = (PoolConfigItem)cfg.getPoolConfig().getPoolItem( i );

                user.setAppPassword( item.getAppPassword() );
                user.setUserName( item.getUserName() );
                user.setUserPassword( item.getUserPassword() );
                user.setUserRole( item.getUserRole() );
                user.setRecvTimeout( item.getRecvTimeout() );

                poolManager.createSessionPool( item.getPrimaryAddrList(), item.getSecondaryAddrList(),
                                               item.getMinPoolSize(),item.getMaxPoolSize(), user, item.getPoolName() );
            }
        }
    }

    /**
     * 关闭池连接
     */
    public static void close() {
        if( poolManager != null )
            poolManager.done();
    }
}
